package com.camelot.ccr.global.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;


/**
 * <pre>
 * 里面的函数是从老版本系统中拷贝的
 * </pre>
 * @author chendd
 * @version V0.1, 2014-2-13 下午3:08:45
 */
public class DateUtil {

	/**
	 * 返回两个日期之间的月数 getMonths:(这里用一句话描述这个方法的作用).
	 * 
	 * @author donghuijun
	 * @param date1
	 * @param date2
	 * @return
	 * @since JDK 1.6
	 */
	public static int getMonths(Date date1, Date date2) {
		int iMonth = 0;
		int flag = 0;
		try {
			Calendar objCalendarDate1 = Calendar.getInstance();
			objCalendarDate1.setTime(date1);

			Calendar objCalendarDate2 = Calendar.getInstance();
			objCalendarDate2.setTime(date2);

			if (objCalendarDate2.equals(objCalendarDate1))
				return 0;
			if (objCalendarDate1.after(objCalendarDate2)) {
				Calendar temp = objCalendarDate1;
				objCalendarDate1 = objCalendarDate2;
				objCalendarDate2 = temp;
			}
			if (objCalendarDate2.get(Calendar.DAY_OF_MONTH) < objCalendarDate1
					.get(Calendar.DAY_OF_MONTH))
				flag = 1;

			if (objCalendarDate2.get(Calendar.YEAR) > objCalendarDate1
					.get(Calendar.YEAR))
				iMonth = ((objCalendarDate2.get(Calendar.YEAR) - objCalendarDate1
						.get(Calendar.YEAR))
						* 12
						+ objCalendarDate2.get(Calendar.MONTH) - flag)
						- objCalendarDate1.get(Calendar.MONTH);
			else
				iMonth = objCalendarDate2.get(Calendar.MONTH)
						- objCalendarDate1.get(Calendar.MONTH) - flag;

		} catch (Exception e) {
			e.printStackTrace();
		}
		return iMonth + 1;
	}

	/**
	 * <pre>
	 * 判断两个日期相隔自然月，如果两个日期相等，则返回0，开始日期不能大于结束日期
	 * 如果出现开始日期大于结束日期，则以开始日期未结束日期，结束日期未开始日期，与老版本系统中函数的结果对应
	 * </pre>
	 * 
	 * @param startDate
	 *            开始日期
	 * @param endDate
	 *            结束日期
	 * @return 相隔的自然月
	 * @author chendd, 2014-2-13 下午3:01:55
	 */
	public static int getMonthCount(Date startDate, Date endDate) {

		int monthCount = 0;
		long startLong = startDate.getTime();
		long endLong = endDate.getTime();
		if (endLong == startLong) {
			return monthCount;
		}

		Date tempDate = null;
		if (endLong < startLong) {
			tempDate = startDate;
			startDate = endDate;
			endDate = tempDate;
		}

		Calendar start = Calendar.getInstance();
		start.setTime(startDate);
		Calendar end = Calendar.getInstance();
		end.setTime(endDate);
		int startYear = start.get(Calendar.YEAR), endYear = end
				.get(Calendar.YEAR);
		int startMonth = start.get(Calendar.MONTH), endMonth = end
				.get(Calendar.MONTH);
		// 进行日期运算
		monthCount = (endYear - startYear) * 12 + (endMonth - startMonth) + 1;
		return monthCount;
	}

	/**
	 * <pre>
	 * 计算两个日期相差的自然月数
	 * </pre>
	 * @param startDate 开始日期
	 * @param endDate 结束日期
	 * @param pattern 日期格式化
	 * @return 自然月数
	 * @author chendd, 2014-2-13 下午3:14:23
	 */
	public static int getMonthCount(String startDate, String endDate , String pattern) {
		int monthCount = 0;
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		try {
			Date d1 = sdf.parse(startDate);
			Date d2 = sdf.parse(endDate);
			monthCount = getMonthCount(d1 , d2);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return monthCount;
	}
	
	/**
	 * <pre>
	 * 计算两个日期相差的自然月数
	 * </pre>
	 * @param startDate 开始日期
	 * @param endDate 结束日期
	 * @param pattern 日期格式化
	 * @return 自然月数
	 * @author chendd, 2014-2-13 下午3:14:23
	 */
	public static int getMonthCount(String startDate, String endDate) {
		
		return getMonthCount(startDate , endDate , Utility.DATE_DEFAULT_PATTERN);
	}
	
	/**
	 * <pre>
	 * 获取当前日期的时间戳，去掉时分秒的时间戳，只取年月日部分
	 * </pre>
	 * @return
	 * @author chendd, 2014-4-2 下午3:00:27
	 */
	public static long getCurrentDateMillis(){
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.HOUR, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND , 0);
		calendar.set(Calendar.MILLISECOND, 0);
		return calendar.getTimeInMillis();
	}
	
	/**
	 * <pre>
	 * 格式化日期
	 * </pre>
	 * @param date 日期
	 * @return 格式化后的字符串
	 * @author chendd, 2014-4-2 下午4:34:43
	 */
	public static String formatDate(Date date){
		
		return formatDate(date , Utility.DATE_DEFAULT_PATTERN);
	}
	
	/**
	 * <pre>
	 * 格式化日期
	 * </pre>
	 * @param date 日期
	 * @param pattern 格式化正则
	 * @return 格式化后的日期字符串
	 * @author chendd, 2014-4-2 下午4:35:00
	 */
	public static String formatDate(Date date, String pattern){
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		String formate = sdf.format(date);
		return formate;
	}
	
	public static String getMonthOfLastDayStr(String period){
		//月份最末一天
		Calendar cal = Calendar.getInstance();
		cal.set(Integer.parseInt(period.split("-")[0]), Integer.parseInt(period.split("-")[1]) - 1, 1);
		
		String strDate = period.split("-")[0] + "-" + 
						 period.split("-")[1] + "-" + 
						 String.valueOf(cal.getActualMaximum(Calendar.DAY_OF_MONTH));		
		return strDate;
	}
	
}
